package com.efast.cafe.portal.service.common.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RestController;

import com.efast.cafe.framework.constant.CommonConstant;
import com.efast.cafe.framework.jdbc.JdbcDao;
import com.efast.cafe.framework.jdbc.JdbcDaoImpl;
import com.efast.cafe.framework.redis.ObjectRedisTemplate;
import com.efast.cafe.framework.util.SpringWebUtils;
import com.efast.cafe.portal.bean.common.ParameterResultBean;
import com.efast.cafe.portal.dao.base.PortalBaseParameterDao;
import com.efast.cafe.portal.entity.base.PortalBaseParameter;
import com.efast.cafe.portal.service.common.IParameterService;

/******************************************************************************
 * @File name   :      ParameterServiceImpl.java
 *
 * @Author      :      fxm
 *
 * @Date        :      2016-7-8
 *
 * @Copyright Notice: 
 * Copyright (c) 2016 Efast Serv. All  Rights Reserved.
 * This software is published under the terms of the Efast Software
 * License version 1.0, a copy of which has been included with this
 * distribution in the LICENSE.txt file.
 * 
 * 
 * ----------------------------------------------------------------------------
 * Date                   Who         Version        Comments
 * 2016-7-8 下午2:27:34        fxm     1.0            Initial Version
 *****************************************************************************/
@Service
@Transactional
@RestController
public class ParameterServiceImpl implements IParameterService{
	
	private ObjectRedisTemplate objectRedisTemplate;
	
	@Qualifier("jdbcDao")
	@Autowired
	private JdbcDao jdbcDao;
	
	
	
	



	@Autowired
	public void setObjectRedisTemplate(ObjectRedisTemplate objectRedisTemplate) {
		this.objectRedisTemplate = objectRedisTemplate;
	}
	
	private PortalBaseParameterDao portalBaseParameterDao;
	
	@Autowired
	public void setPortalBaseParameterDao(PortalBaseParameterDao portalBaseParameterDao) {
		this.portalBaseParameterDao = portalBaseParameterDao;
	}
/*	private IPortalBaseParameterDao portalBaseParameterDao;
	
	@Autowired
	public void setPortalBaseParameterDao(
			IPortalBaseParameterDao portalBaseParameterDao) {
		this.portalBaseParameterDao = portalBaseParameterDao;
	}
*/
	
	

	




	/**
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2016-7-8
	 * @see org.eae.eldf.portal.remote.common.ParameterService#getStringParameter(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	**/
	@Override
	public PortalBaseParameter getParameter(String paramKey, String moduleName) {
		String companyCode = SpringWebUtils.getRequestCompany();
		String username = SpringWebUtils.getRequestUser();
		PortalBaseParameter parameter = null;
		StringBuffer sql = new StringBuffer("select * from portal_base_parameter t ")
		.append("where t.param_key=? ")
		.append("and ( ")
			.append("t.id=? or t.id=? or t.id=? or t.id=? or t.id=? or t.id=?")
		.append(") and t.valid=1");
		List<Object> params = new ArrayList<Object>();
		params.add(paramKey);//参数key
		params.add(CommonConstant.ModuleName.GLOBAL+"."+paramKey);//全局最高级别参数
		params.add(moduleName+"."+paramKey);//模块最高级别参数
		params.add(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey);//企业全局最高级别参数
		params.add(companyCode+"."+moduleName+"."+paramKey);//企业某个模块最高级别参数
		params.add(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey);//用户全局最高级别参数
		params.add(companyCode+"."+username+"."+moduleName+"."+paramKey);//用户某个模块最高级别参数
		List<PortalBaseParameter> list = jdbcDao.queryBySQL(sql.toString(), params, PortalBaseParameter.class);
		if(list.size()>0){
			parameter = list.get(0);
			for(int i=1;i<list.size();i++){
				PortalBaseParameter p = list.get(i);
				//如果变量parameter是Gloal范围Global等级参数
				if(parameter.getId().equals(CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					//现在的参数如果为模块Global/企业全局/企业模块范围/用户全局/用户模块范围 则替换变量
					if(p.getId().equals(moduleName+"."+paramKey) || p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				//如果变量parameter是模块范围Global等级参数
				if(parameter.getId().equals(moduleName+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+moduleName+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
						break;
				}	
			}
		}
		
			//return (T)parameter.getParamValue();
		return parameter;
		
	}




	@Override
	public PortalBaseParameter getParameter(String paramKey, String moduleName, String companyCode, String username) {
		PortalBaseParameter parameter = null;
		StringBuilder  sql = new StringBuilder("select * from portal_base_parameter t ")
		.append("where t.param_key=? ")
		.append("and ( ");
		sql.append("t.id=? or t.id=?");
		if(StringUtils.isNotBlank(companyCode)){
			sql.append(" or t.id=? or t.id=?");
		}
		if(StringUtils.isNotBlank(companyCode) && StringUtils.isNotBlank(username)){
			sql.append(" or t.id=? or t.id=?");
		}
		sql.append(") and t.valid=1");
		List<Object> params = new ArrayList<Object>();
		params.add(paramKey);//参数key
		params.add(CommonConstant.ModuleName.GLOBAL+"."+paramKey);//全局最高级别参数
		params.add(moduleName+"."+paramKey);//模块最高级别参数
		if(StringUtils.isNotBlank(companyCode)){
			params.add(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey);//企业全局最高级别参数
			params.add(companyCode+"."+moduleName+"."+paramKey);//企业某个模块最高级别参数
		}
		if(StringUtils.isNotBlank(companyCode) && StringUtils.isNotBlank(username)){
			params.add(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey);//用户全局最高级别参数
			params.add(companyCode+"."+username+"."+moduleName+"."+paramKey);//用户某个模块最高级别参数
		}
		
		List<PortalBaseParameter> list = jdbcDao.queryBySQL(sql.toString(), params, PortalBaseParameter.class);
		if(list.size()>0){
			parameter = list.get(0);
			for(int i=1;i<list.size();i++){
				PortalBaseParameter p = list.get(i);
				//如果变量parameter是Gloal范围Global等级参数
				if(parameter.getId().equals(CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					//现在的参数如果为模块Global/企业全局/企业模块范围/用户全局/用户模块范围 则替换变量
					if(p.getId().equals(moduleName+"."+paramKey) || p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				//如果变量parameter是模块范围Global等级参数
				if(parameter.getId().equals(moduleName+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+moduleName+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+moduleName+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey) || 
							p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey)){
					if(p.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
					}
				}
				if(parameter.getId().equals(companyCode+"."+username+"."+moduleName+"."+paramKey)){
						parameter = p;
						break;
				}	
			}
		}
		
			//return (T)parameter.getParamValue();
		return parameter;
	}




	@Override
	public List<ParameterResultBean> getParameters(String[] paramKey, String[] moduleName, String companyCode,
			String username) {
		if(paramKey!=null && paramKey.length>0 && moduleName!=null && moduleName.length>0 && paramKey.length==moduleName.length){
			List<ParameterResultBean> result = new ArrayList<>();
			List<Object> params = new ArrayList<Object>();
			StringBuilder  sql = new StringBuilder ("select * from portal_base_parameter t ");
				sql.append("where t.valid=1 and (");
				Map<String, String> moKey = new HashMap<>();
				for(int i=0;i<paramKey.length;i++){
					if(i==0){
						sql.append(" (t.param_key=? and (t.id=? or t.id=? "+(StringUtils.isNotBlank(companyCode)?" or t.id=? or t.id=? ":"")+(StringUtils.isNotBlank(companyCode) && StringUtils.isNotBlank(username)?" or t.id=? or t.id=? ":"")+"))");
						
					}else{
						sql.append(" or (t.param_key=? and (t.id=? or t.id=? "+(StringUtils.isNotBlank(companyCode)?" or t.id=? or t.id=? ":"")+(StringUtils.isNotBlank(companyCode) && StringUtils.isNotBlank(username)?" or t.id=? or t.id=? ":"")+"))");
					}
					moKey.put(paramKey[i], moduleName[i]);
					params.add(paramKey[i]);
					params.add(CommonConstant.ModuleName.GLOBAL+"."+paramKey[i]);
					params.add(moduleName[i]+"."+paramKey[i]);
					if(StringUtils.isNotBlank(companyCode)){
						params.add(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey[i]);//企业全局最高级别参数
						params.add(companyCode+"."+moduleName[i]+"."+paramKey[i]);//企业某个模块最高级别参数
					}
					if(StringUtils.isNotBlank(companyCode) && StringUtils.isNotBlank(username)){
						params.add(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+paramKey[i]);//用户全局最高级别参数
						params.add(companyCode+"."+username+"."+moduleName[i]+"."+paramKey[i]);//用户某个模块最高级别参数
					}
				}
				sql.append(")");
				List<PortalBaseParameter> list = jdbcDao.queryBySQL(sql.toString(), params, PortalBaseParameter.class);
				
				Map<String, List<PortalBaseParameter>> map = new HashMap<>();
				for(PortalBaseParameter p : list){
					if(map.containsKey(p.getParam_key())){
						map.get(p.getParam_key()).add(p);
					}else{
						List<PortalBaseParameter> lp = new ArrayList<>();
						lp.add(p);
						map.put(p.getParam_key(), lp);
					}
				}
				
				Iterator<Entry<String, List<PortalBaseParameter>>> it = map.entrySet().iterator();
				while(it.hasNext()){
					PortalBaseParameter parameter = null;
					List<PortalBaseParameter> lst = it.next().getValue();
					if(lst.size()>0){
						parameter = lst.get(0);
						for(int i=1;i<lst.size();i++){
							PortalBaseParameter p = lst.get(i);
							//如果变量parameter是Gloal范围Global等级参数
							if(parameter.getId().equals(CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key())){
								//现在的参数如果为模块Global/企业全局/企业模块范围/用户全局/用户模块范围 则替换变量
								if(p.getId().equals(moKey.get(parameter.getParam_key())+"."+parameter.getParam_key()) || p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
								}
							}
							//如果变量parameter是模块范围Global等级参数
							if(parameter.getId().equals(moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
								if(p.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
								}
							}
							if(parameter.getId().equals(companyCode+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key())){
								if(p.getId().equals(companyCode+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
								}
							}
							if(parameter.getId().equals(companyCode+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
								if(p.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key()) || 
										p.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
								}
							}
							if(parameter.getId().equals(companyCode+"."+username+"."+CommonConstant.ModuleName.GLOBAL+"."+parameter.getParam_key())){
								if(p.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
								}
							}
							if(parameter.getId().equals(companyCode+"."+username+"."+moKey.get(parameter.getParam_key())+"."+parameter.getParam_key())){
									parameter = p;
									break;
							}	
						}
						
					}
					if(parameter!=null){
						ParameterResultBean res = new ParameterResultBean();
						res.setKey(parameter.getParam_key());
						res.setDesc(parameter.getParam_desc());
						String dataType = parameter.getData_type();
						res.setValue(parameter.getParam_value());
						if(dataType.equals(CommonConstant.ParameterDataType.BOOLEAN)){
							res.setValue(Boolean.parseBoolean(parameter.getParam_value()));
						}
						if(dataType.equals(CommonConstant.ParameterDataType.INTEGER)){
							res.setValue(Integer.parseInt(parameter.getParam_value()));
						}
						if(dataType.equals(CommonConstant.ParameterDataType.FLOAT)){
							res.setValue(Float.parseFloat(parameter.getParam_value()));
						}
						result.add(res);
					}
				}
				return result;
		}
		
		return null;
	}




	@Override
	public List<ParameterResultBean> getParameters(String paramGroup, String companyCode, String username) {
		String sql = "select DISTINCT t.param_key,t.module_name from portal_base_parameter t where t.param_group=?";
		List<Map<String, Object>> list = jdbcDao.queryForListMap(sql, new Object[]{paramGroup});
		int i=0;
		String[] keys = new String[list.size()];
		String[] modules = new String[list.size()];
		
		for(Map<String, Object> map : list){
			keys[i] = (map.get("param_key").toString());
			modules[i] = (map.get("module_name").toString());
			i++;
		}
		if(keys.length>0){
			return getParameters(keys,modules,companyCode,username);
		}
		return null;
	}








	
	    /* (非 Javadoc)
	    * 
	    * 
	    * @param paramKey
	    * @param moduleName
	    * @return
	    * @see com.efast.cafe.portal.remote.common.ParameterService#api_getParameter(java.lang.String, java.lang.String)
	    */
	    
	@Override
	public PortalBaseParameter api_getParameter(String paramKey, String moduleName) {
		// TODO Auto-generated method stub
		return getParameter(paramKey,moduleName);
	}








	
	    /* (非 Javadoc)
	    * 
	    * 
	    * @param paramKey
	    * @param moduleName
	    * @param companyCode
	    * @param username
	    * @return
	    * @see com.efast.cafe.portal.remote.common.ParameterService#api_getParameter(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	    */
	    
	@Override
	public PortalBaseParameter api_getParameter(String paramKey, String moduleName, String companyCode,
			String username) {
		return getParameter(paramKey,moduleName,companyCode,username);
	}
	

}
